import { comonHandlers } from "./handlers";
import "./externals";

function interruptRequest() {
  // chrome.tabs.query(
  //   {
  //     active: true,
  //   },
  //   ([tab]) => {
  //     chrome.debugger.attach({
  //       tabId: tab.id
  //     }, "1.0", () => {
  //       chrome.debugger.sendCommand({
  //         tabId: tab.id
  //       }, "Network.enable");
  //       chrome.debugger.onEvent.addListener((source, method, params) => {
  //         console.log(source, method, params);
  //       });
  //     });
  //   }
  // );
}

const handlers = {
  ...comonHandlers,
};

async function evaluate<T = any>({
  type,
  args,
}: {
  type: string;
  args: any[];
}) {
  const handler = handlers[type];
  if (handler) {
    const data = await handler(...args);
    return data as T;
  }
  throw new Error("无此api");
}

// @ts-ignore
window.evaluate = evaluate;
// @ts-ignore
window.handlers = handlers;

function extendHandler(key: string, handler: () => Promise<any>) {
  handlers[key] = handler;
}

// @ts-ignore
window.extendHandler = extendHandler;

// const version = Number(/Chrome\/(\d+)/.exec(navigator.userAgent)![1]);
// chrome.webRequest.onBeforeSendHeaders.addListener(
//   (details) => {
//     if (details.type === "xmlhttprequest") {
//       let headers = details.requestHeaders;
//       if (headers) {
//         headers.forEach((item) => {
//           if (item.name.startsWith("_")) {
//             let name = item.name.substring(1);
//             if (
//               name === "user-agent" ||
//               name === "origin" ||
//               name === "cookie"
//             ) {
//               let _item = headers!.find(
//                 (item) => item.name.toLowerCase() === name
//               );
//               if (_item) {
//                 _item.value = item.value;
//               }
//             }
//             item.name = name;
//           }
//         });
//       }
//       return {
//         requestHeaders: details.requestHeaders,
//       };
//     }
//   },
//   {
//     urls: ["*://*/*"],
//   },
//   version > 76
//     ? ["blocking", "requestHeaders", "extraHeaders"]
//     : ["blocking", "requestHeaders"]
// );

chrome.runtime.onMessage.addListener(({ type, data }, { tab }) => {
  if (type === "jumpAndExcuteScript") {
    chrome.tabs.create(
      {
        url: data.url,
        windowId: tab!.windowId,
      },
      (tab) => {
        chrome.tabs.executeScript(tab.id!, {
          code: data.code,
          runAt: "document_end",
        });
      }
    );
    chrome.tabs.remove(tab!.id!);
  } else if (type === "fetch-and-jump") {
    fetch(data.url, data.params).finally(() => {
      chrome.tabs.update(tab!.id!, {
        url: data.gotoUrl,
      });
    });
  }
});

// @ts-ignore
chrome.storage.sync.onChanged.addListener(({ openPageInIncognito }) => {
  if (openPageInIncognito && openPageInIncognito.newValue) {
    if (!chrome.extension.inIncognitoContext) {
      setTimeout(() => {
        chrome.storage.sync.get("openPageInIncognito", (data) => {
          if (data.openPageInIncognito) {
            chrome.storage.sync.remove("openPageInIncognito");
            chrome.windows.create({
              incognito: true,
              url: openPageInIncognito.newValue,
            });
          }
        });
      }, 50);
      return;
    }
    chrome.storage.sync.remove("openPageInIncognito");
    window.open(openPageInIncognito.newValue);
  }
});
